package com.tangsm.spring.boot.strategy.message.abstr.base;

import com.tangsm.spring.boot.strategy.message.domain.Message;
import com.tangsm.spring.boot.strategy.util.RandomUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * 对外发送信息
 *
 * @author tangyb
 * @date 2021/11/25 10:53
 */
public abstract class AbstractSendMessage {
    protected static final Logger log = LoggerFactory.getLogger(AbstractSendMessage.class);

    private RedisTemplate<String, String> redisTemplate;

    /**
     * 发送消息验证码接口
     *
     * @param message 消息参数
     * @return 响应结果
     */
    public String send(Message message) {
        log.info("SendMessageSuper，发送消息验证码执行入口，target={}，type={}", message.getTarget(), message.getType());

        // 实例初始化
        init();

        // 缓存验证码
        if (message.getIsValidCode()) {
            String code = RandomUtils.generateNumber(6);
            cacheCode(message.getTarget(), message.getType(), code);
        }

        // 各通道策略业务实现
        transportBusiness(message);

        return "成功";
    }

    /**
     * 各通道策略业务实现
     *
     * @param message 消息参数
     */
    protected abstract void transportBusiness(Message message);

    /**
     * 缓存验证码
     *
     * @param target 发送目标，手机号码或邮箱
     * @param type   消息类型
     * @param code   验证码
     */
    protected void cacheCode(String target, String type, String code) {
        log.info("缓存验证码，target={}，type={}, code={}", target, type, code);

        // redis缓存，有事时间1分钟
        redisTemplate.opsForValue().set(String.format("target:%s:%s", type, target),
                code, 1L, TimeUnit.MINUTES);
    }

    /**
     * 初始化RedisTemplate对象
     */
    private void init() {
        redisTemplate = setRedisTemplate();
    }

    /**
     * 初始化 redisTemplate对象
     */
    protected abstract RedisTemplate<String, String> setRedisTemplate();
}
